using System;
using System.Collections.Generic;
using Csla;
using System.Data;
using Ent.AccesoDatos;

namespace Ent.Inscripcion.Core
{
    [Serializable]
    public class UsuarioLista :
      ReadOnlyListBase<UsuarioLista, UsuarioInfo>
    {
        #region Authorization Rules

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowGet(typeof(UsuarioLista), "Role");
        }

        #endregion

        #region Factory Methods

        public static UsuarioLista GetUsuarioLista(UsuarioCriterio filter)
        {
            return DataPortal.Fetch<UsuarioLista>(filter);
        }

        private UsuarioLista()
        { /* require use of factory methods */ }

        #endregion


        #region Data Access

        private void DataPortal_Fetch(UsuarioCriterio criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Nombre", criteria.Nombre),
                                     new Parametro("Apellido", criteria.Apellido),
                                     new Parametro("Login", criteria.Login)
                                 };
            var datos = accesoDatos.EjecutarReader("ObtenerUsuarios", parametros);
            while (datos.Datos.Read())
            {
                Add(UsuarioInfo.GetUsuarioInfo(datos));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class UsuarioInfo : ReadOnlyBase<UsuarioInfo>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
        }

        private static PropertyInfo<string> NombreProperty = RegisterProperty<string>(o => o.Nombre, "Name");
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
        }

        private static PropertyInfo<string> ApellidoProperty = RegisterProperty<string>(o => o.Apellido, "Name");
        public string Apellido
        {
            get { return GetProperty(ApellidoProperty); }
        }

        private static PropertyInfo<string> LoginProperty = RegisterProperty<string>(o => o.Login, "Name");
        public string Login
        {
            get { return GetProperty(LoginProperty); }
        }


        private static PropertyInfo<string> MailProperty = RegisterProperty<string>(o => o.Mail, "Name");
        public string Mail
        {
            get { return GetProperty(MailProperty); }
        }

        #endregion

        #region Factory Methods

        internal static UsuarioInfo GetUsuarioInfo(object childData)
        {
            return DataPortal.FetchChild<UsuarioInfo>(childData);
        }

        private UsuarioInfo()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(Reader datos)
        {
            LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
            LoadProperty(NombreProperty, datos.Datos.GetString(1));
            LoadProperty(ApellidoProperty, datos.Datos.GetString(2));
            LoadProperty(LoginProperty, datos.Datos.GetString(3));
            LoadProperty(MailProperty, datos.Datos.GetString(5));
            
        }

        #endregion
    }
}
